home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / g / gnu_c / gpplib22.zoo / libtests / trationa.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-30  |  4.5 KB  |  195 lines

  1. /*
  2.  a test file for Rational class
  3.  */
  4.  
  5. #include <xrationa.h>
  6.  
  7. #include <assert.h>
  8.  
  9. #define tassert(ex) {if ((ex)) cerr << #ex << "\n"; \
  10.                        else _assert(#ex, __FILE__,__LINE__); }
  11.  
  12. #ifndef PI
  13. #  define PI (3.14159265358979323846)
  14. #endif
  15.  
  16. void identtest(Rational& a, Rational& b, Rational& c)
  17. {
  18.   Rational one(1, 1);
  19.  
  20.   assert(-(-a) == a);
  21.   assert((a + b) ==  (b + a));
  22.   assert((a + (-b)) ==  (a - b));
  23.   assert((a * b) ==  (b * a));
  24.   assert((a * (-b)) == -(a * b));
  25.   assert((a / (-b)) == -(a / b));
  26.   assert((a / b) == (a * (one / b)));
  27.   assert((a / b) == (one / (b / a)));
  28.   assert((a - b) ==  -(b - a));
  29.   assert((a + (b + c)) == ((a + b) + c));
  30.   assert((a * (b * c)) == ((a * b) * c));
  31.   assert((a * (b + c)) == ((a * b) + (a * c)));
  32.   assert(((a - b) + b) == a);
  33.   assert(((a + b) - b) == a);
  34.   assert(((a * b) / b) == a);
  35.   assert(((a / b) * b) == a);
  36.  
  37.   Rational x = a;
  38.   x *= b;
  39.   assert(x == (a * b));
  40.   x += c;
  41.   assert(x == ((a * b) + c));
  42.   x -= a;
  43.   assert(x == (((a * b) + c) - a));
  44.   x /= b;
  45.   assert(x == ((((a * b) + c) - a) / b));
  46.  
  47.   assert(x.OK());
  48. }
  49.  
  50.  
  51.  
  52. void simpletest()
  53. {
  54.   Rational one = 1;
  55.   assert(one.OK());
  56.   Rational third(1, 3);
  57.   assert(third.OK());
  58.   Rational half(1, 2);
  59.   assert(half.OK());
  60.  
  61.   Rational two(2);
  62.   Rational zero(0);
  63.   Rational r;
  64.   r = two+zero;
  65.  
  66.   cout << "one = " << one << "\n";
  67.   cout << "two = " << r << "\n";
  68.   cout << "third = " << third << "\n";
  69.   cout << "half = " << half << "\n";
  70.  
  71.   cout << "third + half = " << third + half << "\n";
  72.   cout << "third - half = " << third - half << "\n";
  73.   cout << "third * half = " << third * half << "\n";
  74.   cout << "third / half = " << third / half << "\n";
  75.  
  76.   Rational onePointTwo = 1.2;
  77.   cout << "onePointTwo = " << onePointTwo << "\n";
  78.   cout << "double(onePointTwo) = " << double(onePointTwo) << "\n";
  79.  
  80.   Rational a = one;
  81.   cout << "a = " << a << "\n";
  82.   assert(a.OK());
  83.   a += half;
  84.   cout << "a += half = " << a << "\n";
  85.   assert(a == Rational(3, 2));
  86.   a -= half;
  87.   cout << "a -= half = " << a << "\n";
  88.   assert(a == Rational(1));
  89.   a *= half;
  90.   cout << "a *= half = " << a << "\n";
  91.   assert(a == half);
  92.   a /= half;
  93.   cout << "a /= half = " << a << "\n";
  94.   assert(a == Rational(1));
  95.   assert(a.OK());
  96.  
  97.   identtest(one, one, one);
  98.   identtest(one, third, half);
  99.   identtest(third, half, one);
  100.   identtest(onePointTwo, half, a);
  101. }
  102.  
  103. void pitest()
  104. {
  105.   Rational half(1, 2);
  106.   Rational approxpi(355, 113);
  107.   assert(approxpi.OK());
  108.   cout << "approxpi = " << approxpi << "\n";
  109.   cout << "double(approxpi) = " << double(approxpi) << "\n";
  110.  
  111.   Rational rpi = Rational(M_PI);
  112.   cout << "rpi = Rational(PI) = " << rpi << "\n";
  113.   assert(rpi.OK());
  114.   cout << "double(rpi) = " << double(rpi) << "\n";
  115.  
  116.   cout << "approxpi + rpi = " << approxpi + rpi << "\n";
  117.   cout << "approxpi - rpi = " << approxpi - rpi << "\n";
  118.   cout << "approxpi * rpi = " << approxpi * rpi << "\n";
  119.   cout << "approxpi / rpi = " << approxpi / rpi << "\n";
  120.  
  121.   Rational negapproxpi = -approxpi;
  122.  
  123.   cout << "-approxpi = " << negapproxpi << "\n";
  124.   assert(sign(negapproxpi) < 0);
  125.   cout << "abs(negapproxpi) = " << abs(negapproxpi) << "\n";
  126.   assert(abs(negapproxpi) == approxpi);
  127.  
  128.   assert(approxpi != rpi);
  129.   assert(approxpi >= rpi);
  130.   assert(approxpi > rpi);
  131.   assert(!(approxpi == rpi));
  132.   assert(!(approxpi <= rpi));
  133.   assert(!(approxpi < rpi));
  134. #ifdef __GNUC__
  135.   assert((approxpi >? rpi) == approxpi);
  136.   assert((approxpi <? rpi) == rpi);
  137. #endif
  138.  
  139.   assert(floor(approxpi) == 3);
  140.   assert(ceil(approxpi) == 4);
  141.   assert(trunc(approxpi) == 3);
  142.   assert(round(approxpi) == 3);
  143.  
  144.   assert(floor(negapproxpi + half) == -3);
  145.   assert(ceil(negapproxpi + half) == -2);
  146.   assert(trunc(negapproxpi + half) == -2);
  147.   assert(round(negapproxpi + half) == -3);
  148.  
  149.   identtest(approxpi, rpi, negapproxpi);
  150.   identtest(rpi, approxpi, rpi);
  151.   identtest(negapproxpi, half, rpi);
  152. }
  153.  
  154.  
  155.  
  156. void IOtest()
  157. {
  158.   Rational a;
  159.   cout << "\nenter a Rational in form a/b or a: ";
  160.   cin >> a;
  161.   cout << "number = " << a << "\n";
  162.   assert(a.OK());
  163. }
  164.  
  165. // as a fct just to test Rational fcts
  166. Rational estimate_e(long n)
  167. {
  168.   Rational x = Rational(n + 1, n);
  169.   Rational e = pow(x, n);
  170.   return e;
  171. }
  172.  
  173. void etest(long n)
  174. {
  175.   cout << "approximating e as pow(1+1/n),n) for n =" << n << "\n";
  176.   Rational approxe = estimate_e(n);
  177.   assert(approxe.OK());
  178.   cout << "double(approxe) = " << double(approxe) << "\n";
  179.   cout << "log(approxe) = " << log(approxe) << "\n";
  180.   assert(log(approxe) <= 1.0);
  181.   cout << "approxe = " << approxe << "\n";
  182. }
  183.  
  184. int main()
  185. {
  186.   simpletest();
  187.   pitest();
  188.   IOtest();
  189.   etest(10);
  190.   etest(100);
  191.   etest(1000);
  192.   cout << "\nEnd of test\n";
  193.   return 0;
  194. }
  195.